package cn.net.Collection;
//3.测试List集合的迭代
/**
 * 集合迭代的方式:
 * 1.for循环
 * 2.增强for循环
 * 3.iterator
 * 4.listIterator
 * */
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*
测试List接口的四种遍历方法
因为List集合是有序的,元素有下标,所以可以根据下标进行集合遍历
 */
public class TestList2 {
    public static void main(String[] args) {
        List <String>list = new ArrayList<String>();// 多态对象
        list.add("青龙");
        list.add("白虎");
        list.add("朱雀");
        list.add("玄武");
        System.out.println(list);

        /**方式一:采用普通for循环遍历； 普通for循环遍历效率低*/
        System.out.println("---------普通for循环遍历---------------");
        //从何开始:0 到哪结束:i<list.size() 如何变化:i++
        for (int i=0;i<list.size();i++){//i<=list.size();java.lang.IndexOutOfBoundsException:Index: 0~4=5,Size: 0~3=4
            System.out.println(list.get(i));//get()获取每个下标值对应的元素
        }
        /**方式二:可以通过foreach提高遍历效率
        好处:语法简洁效率高 坏处:不能按照下标来处理数据*/
        System.out.println("----------增强for循环遍历--------------------");

        for (String s: list
             ) {
            System.out.println(s);
        }
        System.out.println("---------使用迭代器iterator()遍历集合------------");
        /**方式三:iterator() 是继承自父接口Collection的**/
        Iterator<String> it = list.iterator();//获取迭代器
        while (it.hasNext()){//判断下一个元素
            System.out.println(it.next());//next()获取对应元素
        }
        System.out.println("-----------使用迭代器listIterator()遍历集合-----------------------");
        /**方式四:listIterator()是使用List子接口特有的**/
        //Iterator<E> Iterator --父接口 --hasNext() --next() --remove()
        //ListIterator<E> ListIterator --子接口,拥有父接口的方法,也有自己特有的方法(逆向迭代)
        //public interface ListIterator<E> extends Iterator<E>
        ListIterator<String> it2 = list.listIterator();
        while(it2.hasNext()){
            System.out.println(it2.next());
        }


    }
}
/*
//思考:方式3和方式4有什么区别?
		//3使用的是父接口中的Iterator 4使用的是子接口中的ListIterator
		//子接口拥有父接口的所有方法,除此之外,子接口也可以拥有自己特有的方法,目前是向前/逆向遍历
 */